import axios from 'axios'
import {Message} from 'element-ui'
import router from '../router'

// 拦截服务器响应体
axios.interceptors.response.use(success => {
  // 如果响应体的状态为 200 并且返回消息状态码为 500，表示请求失败
  if (success.status && success.status == 200 && success.data.status == 500) {
    Message.error({message: success.data.msg})
    // 失败信息就不再放行响应体
    return;
  }
  // 如果响应体中有消息
  if (success.data.msg) {
    Message.success({message: success.data.msg})
  }
  return success.data;
}, error => {
  if (error.response.status == 504 || error.response.status == 404) {
    Message.error({message: '服务器别吃了 ╮(╯▽╰)╭'})
  } else if (error.response.status == 403) {
    Message.error({message: '权限不足，请联系管理员！'})
  } else if (error.response.status == 401) {
    Message.error({message: '尚未登录，请登录！'})
    router.replace('/');
  } else {
    // 如果都不是以上错误，并且返回消息中存在错误信息，则提示错误信息
    if (error.response.data.msg) {
      Message.error({message: error.response.data.msg})
    } else {
      Message.error({message: '未知错误！'})
    }
  }
  return;
});


// 针对 axios 请求进行封装
let base = '/api';

// 登录请求单独封装，原因是登录接口接收的参数类型为 key/value 形式
export const postKeyValueRequest = (url, params) => {
  return axios({
    method: 'post',
    // 通过引用进行拼接
    url: `${base}${url}`,
    data: params,
    // 将JSON格式转换成 key/value 格式
    transformRequest: [function (data) {
      let ret = '';
      for (let i in data) {
        ret += encodeURIComponent(i) + '=' + encodeURIComponent(data[i]) + '&'
      }
      return ret;
    }],
    headers: {
      'context-Tupe': 'application/x-www-form-urlencoded'
    }
  })
};

// 请求方法封装
export const postRequest = (url, params) => {
  return axios({
    method: 'post',
    url: `${base}${url}`,
    data: params
  })
};

export const putRequest = (url, params) => {
  return axios({
    method: 'put',
    url: `${base}${url}`,
    data: params
  })
};

export const getRequest = (url, params) => {
  return axios({
    method: 'get',
    url: `${base}${url}`,
    data: params
  })
};

export const deleteRequest = (url, params) => {
  return axios({
    method: 'delete',
    url: `${base}${url}`,
    data: params
  })
};
